using UnityEngine;

namespace Spine.Unity.Examples {
    /// <summary>
    /// Spineboy目标控制脚本
    /// 实现通过鼠标控制指定骨骼在屏幕空间的位置
    /// </summary>
    public class SpineboyTargetController : MonoBehaviour {
        
        #region 组件配置
        [Tooltip("Spine动画控制器")]
        public SkeletonAnimation skeletonAnimation;

        [SpineBone(dataField: "skeletonAnimation")]  // 关联SkeletonAnimation组件
        [Tooltip("目标骨骼名称")]
        public string boneName;

        [Tooltip("主摄像机")]
        public Camera cam;
        #endregion

        private Bone bone;  // 目标骨骼引用

        /// <summary>
        /// 初始化组件有效性验证
        /// 自动获取关联的SkeletonAnimation组件
        /// </summary>
        void OnValidate () {
            if (skeletonAnimation == null)
                skeletonAnimation = GetComponent<SkeletonAnimation>();
        }

        /// <summary>
        /// 初始化骨骼引用
        /// 在游戏启动时查找指定名称的骨骼
        /// </summary>
        void Start () {
            // 通过骨骼名称获取骨骼对象
            bone = skeletonAnimation.Skeleton.FindBone(boneName);
        }

        /// <summary>
        /// 每帧更新骨骼位置
        /// 实现鼠标控制骨骼的屏幕空间定位
        /// </summary>
        void Update () {
            // 获取鼠标屏幕坐标
            Vector3 mousePosition = Input.mousePosition;
            
            // 转换为世界坐标（以摄像机为参考）
            Vector3 worldMousePosition = cam.ScreenToWorldPoint(mousePosition);
            
            // 转换到骨骼本地坐标系
            Vector3 skeletonSpacePoint = skeletonAnimation.transform.InverseTransformPoint(worldMousePosition);
            
            // 应用Spine坐标系缩放（处理Spine坐标系与Unity坐标系差异）
            skeletonSpacePoint.x *= skeletonAnimation.Skeleton.ScaleX;
            skeletonSpacePoint.y *= skeletonAnimation.Skeleton.ScaleY;
            
            // 设置骨骼本地位置
            bone.SetLocalPosition(skeletonSpacePoint);
        }
    }
}